package com.wxpay.service;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

/**
 * 通用增删改查service
 *
 * @Author worlt
 * @Date 2025/4/21 下午11:22
 */
public abstract class BaseService<T> {

    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private Mapper<T> mapper;

    /**
     * 根据id查询数据
     *
     * @param id
     * @return
     */
    public T selectById(Long id) {
        logger.debug("执行selectById操作 - 参数: id={}", id);
        long startTime = System.currentTimeMillis();
        try {
            T result = mapper.selectByPrimaryKey(id);
            logger.debug("selectById操作执行完成 - 耗时: {}ms, 结果: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("selectById操作异常 - 参数: id={}, 异常: {}", id, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 查询所有数据
     *
     * @return
     */
    public List<T> selectAll() {
        logger.debug("执行selectAll操作");
        long startTime = System.currentTimeMillis();
        try {
            List<T> result = mapper.select(null);
            logger.debug("selectAll操作执行完成 - 耗时: {}ms, 结果数量: {}", System.currentTimeMillis() - startTime, result.size());
            return result;
        } catch (Exception e) {
            logger.error("selectAll操作异常: {}", e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 根据条件查询一条数据，如果有多条数据会抛出异常
     *
     * @param record
     * @return
     */
    public T selectOne(T record) {
        logger.debug("执行selectOne操作 - 参数: {}", record);
        long startTime = System.currentTimeMillis();
        try {
            T result = mapper.selectOne(record);
            logger.debug("selectOne操作执行完成 - 耗时: {}ms, 结果: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("selectOne操作异常 - 参数: {}, 异常: {}", record, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 根据条件查询数据列表
     *
     * @param record
     * @return
     */
    public List<T> selectListByWhere(T record) {
        logger.debug("执行selectListByWhere操作 - 参数: {}", record);
        long startTime = System.currentTimeMillis();
        try {
            List<T> result = mapper.select(record);
            logger.debug("selectListByWhere操作执行完成 - 耗时: {}ms, 结果数量: {}", System.currentTimeMillis() - startTime, result.size());
            return result;
        } catch (Exception e) {
            logger.error("selectListByWhere操作异常 - 参数: {}, 异常: {}", record, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 分页查询
     *
     * @param page
     * @param rows
     * @param record
     * @return
     */
    public PageInfo<T> selectPageListByWhere(Integer page, Integer rows, T record) {
        logger.debug("执行selectPageListByWhere操作 - 参数: page={}, rows={}, condition={}", page, rows, record);
        long startTime = System.currentTimeMillis();
        try {
            // 设置分页条件
            PageHelper.startPage(page, rows);
            List<T> list = this.selectListByWhere(record);
            PageInfo<T> result = new PageInfo<T>(list);
            logger.debug("selectPageListByWhere操作执行完成 - 耗时: {}ms, 总记录数: {}, 当前页数据量: {}", 
                    System.currentTimeMillis() - startTime, result.getTotal(), result.getSize());
            return result;
        } catch (Exception e) {
            logger.error("selectPageListByWhere操作异常 - 参数: page={}, rows={}, condition={}, 异常: {}", 
                    page, rows, record, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 新增数据，返回成功的条数
     *
     * @param record
     * @return
     */
    public Integer save(T record) {
        logger.debug("执行save操作 - 参数: {}", record);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.insert(record);
            logger.debug("save操作执行完成 - 耗时: {}ms, 影响行数: {}, 结果: {}", 
                    System.currentTimeMillis() - startTime, result, record);
            return result;
        } catch (Exception e) {
            logger.error("save操作异常 - 参数: {}, 异常: {}", record, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 新增数据，使用不为null的字段，返回成功的条数
     *
     * @param record
     * @return
     */
    public Integer saveSelective(T record) {
        logger.debug("执行saveSelective操作 - 参数: {}", record);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.insertSelective(record);
            logger.debug("saveSelective操作执行完成 - 耗时: {}ms, 影响行数: {}, 结果: {}", 
                    System.currentTimeMillis() - startTime, result, record);
            return result;
        } catch (Exception e) {
            logger.error("saveSelective操作异常 - 参数: {}, 异常: {}", record, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 修改数据，返回成功的条数
     *
     * @param record
     * @return
     */
    public Integer update(T record) {
        logger.debug("执行update操作 - 参数: {}", record);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.updateByPrimaryKey(record);
            logger.debug("update操作执行完成 - 耗时: {}ms, 影响行数: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("update操作异常 - 参数: {}, 异常: {}", record, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 修改数据，使用不为null的字段，返回成功的条数
     *
     * @param record
     * @return
     */
    public Integer updateSelective(T record) {
        logger.debug("执行updateSelective操作 - 参数: {}", record);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.updateByPrimaryKeySelective(record);
            logger.debug("updateSelective操作执行完成 - 耗时: {}ms, 影响行数: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("updateSelective操作异常 - 参数: {}, 异常: {}", record, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 修改数据，根据指定条件使用不为null的字段，返回成功的条数
     *
     * @param record
     * @return
     */
    public Integer updateSelective(T record, Object example) {
        logger.debug("执行updateSelective(条件)操作 - 参数: record={}, example={}", record, example);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.updateByExampleSelective(record, example);
            logger.debug("updateSelective(条件)操作执行完成 - 耗时: {}ms, 影响行数: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("updateSelective(条件)操作异常 - 参数: record={}, example={}, 异常: {}", 
                    record, example, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 修改数据，null值也会被更新，返回成功的条数
     *
     * @param record
     * @return
     */
    public Integer updateByExample(T record, Object example) {
        logger.debug("执行updateByExample操作 - 参数: record={}, example={}", record, example);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.updateByExample(record, example);
            logger.debug("updateByExample操作执行完成 - 耗时: {}ms, 影响行数: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("updateByExample操作异常 - 参数: record={}, example={}, 异常: {}", 
                    record, example, e.getMessage(), e);
            throw e;
        }
    }

    /**
     *
     * 批量修改
     *
     * @author YunGouOS
     *
     * @date 2020年1月13日 下午6:37:09
     */
    public Integer updateByIds(Class<T> clazz, T record, String property, List<Object> values) {
        logger.debug("执行updateByIds操作 - 参数: class={}, record={}, property={}, values={}", 
                clazz.getSimpleName(), record, property, values);
        long startTime = System.currentTimeMillis();
        try {
            Example example = new Example(clazz);
            example.createCriteria().andIn(property, values);
            Integer result = mapper.updateByExampleSelective(record, example);
            logger.debug("updateByIds操作执行完成 - 耗时: {}ms, 影响行数: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("updateByIds操作异常 - 参数: class={}, record={}, property={}, values={}, 异常: {}", 
                    clazz.getSimpleName(), record, property, values, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 根据id删除数据
     *
     * @param id
     * @return
     */
    public Integer deleteById(Long id) {
        logger.debug("执行deleteById操作 - 参数: id={}", id);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.deleteByPrimaryKey(id);
            logger.debug("deleteById操作执行完成 - 耗时: {}ms, 影响行数: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("deleteById操作异常 - 参数: id={}, 异常: {}", id, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 批量删除
     *
     * @param clazz
     * @param property
     * @param values
     * @return
     */
    public Integer deleteByIds(Class<T> clazz, String property, List<Object> values) {
        logger.debug("执行deleteByIds操作 - 参数: class={}, property={}, values={}", 
                clazz.getSimpleName(), property, values);
        long startTime = System.currentTimeMillis();
        try {
            Example example = new Example(clazz);
            example.createCriteria().andIn(property, values);
            Integer result = mapper.deleteByExample(example);
            logger.debug("deleteByIds操作执行完成 - 耗时: {}ms, 影响行数: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("deleteByIds操作异常 - 参数: class={}, property={}, values={}, 异常: {}", 
                    clazz.getSimpleName(), property, values, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 根据条件做删除
     *
     * @param record
     * @return
     */
    public Integer deleteByWhere(T record) {
        logger.debug("执行deleteByWhere操作 - 参数: {}", record);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.delete(record);
            logger.debug("deleteByWhere操作执行完成 - 耗时: {}ms, 影响行数: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("deleteByWhere操作异常 - 参数: {}, 异常: {}", record, e.getMessage(), e);
            throw e;
        }
    }

    public Integer deleteByWhere(Example example) {
        logger.debug("执行deleteByWhere(Example)操作 - 参数: {}", example);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.deleteByExample(example);
            logger.debug("deleteByWhere(Example)操作执行完成 - 耗时: {}ms, 影响行数: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("deleteByWhere(Example)操作异常 - 参数: {}, 异常: {}", example, e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 查询指定条件的数量
     */
    public Integer selectCount(T record) {
        logger.debug("执行selectCount操作 - 参数: {}", record);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.selectCount(record);
            logger.debug("selectCount操作执行完成 - 耗时: {}ms, 结果: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("selectCount操作异常 - 参数: {}, 异常: {}", record, e.getMessage(), e);
            throw e;
        }
    }

    public List<T> selectByExample(Example example) {
        logger.debug("执行selectByExample操作 - 参数: {}", example);
        long startTime = System.currentTimeMillis();
        try {
            List<T> result = mapper.selectByExample(example);
            logger.debug("selectByExample操作执行完成 - 耗时: {}ms, 结果数量: {}", System.currentTimeMillis() - startTime, result.size());
            return result;
        } catch (Exception e) {
            logger.error("selectByExample操作异常 - 参数: {}, 异常: {}", example, e.getMessage(), e);
            throw e;
        }
    }

    public T selectOneByExample(Example example) {
        logger.debug("执行selectOneByExample操作 - 参数: {}", example);
        long startTime = System.currentTimeMillis();
        try {
            T result = mapper.selectOneByExample(example);
            logger.debug("selectOneByExample操作执行完成 - 耗时: {}ms, 结果: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("selectOneByExample操作异常 - 参数: {}, 异常: {}", example, e.getMessage(), e);
            throw e;
        }
    }

    public Integer selectCountByExample(Example example) {
        logger.debug("执行selectCountByExample操作 - 参数: {}", example);
        long startTime = System.currentTimeMillis();
        try {
            Integer result = mapper.selectCountByExample(example);
            logger.debug("selectCountByExample操作执行完成 - 耗时: {}ms, 结果: {}", System.currentTimeMillis() - startTime, result);
            return result;
        } catch (Exception e) {
            logger.error("selectCountByExample操作异常 - 参数: {}, 异常: {}", example, e.getMessage(), e);
            throw e;
        }
    }

    public PageInfo<T> selectPageByExample(Integer page, Integer rows, Example example) {
        logger.debug("执行selectPageByExample操作 - 参数: page={}, rows={}, example={}", page, rows, example);
        long startTime = System.currentTimeMillis();
        try {
            // 设置分页条件
            PageHelper.startPage(page, rows);
            List<T> list = mapper.selectByExample(example);
            PageInfo<T> result = new PageInfo<T>(list);
            logger.debug("selectPageByExample操作执行完成 - 耗时: {}ms, 总记录数: {}, 当前页数据量: {}", 
                    System.currentTimeMillis() - startTime, result.getTotal(), result.getSize());
            return result;
        } catch (Exception e) {
            logger.error("selectPageByExample操作异常 - 参数: page={}, rows={}, example={}, 异常: {}", 
                    page, rows, example, e.getMessage(), e);
            throw e;
        }
    }
}
